package skladowisko;

/**
 *
 * @author Krzysiek
 */
public class ZawartoscPola
{

    private final Warstwa[] warstwy;
    private int liczbaWarstw;
    private int pierwszaWolna;
    private Pole pole;
    //***************************************************************************

    public ZawartoscPola(Pole pole, int liczbaWarstw)
    {
        this.pole = pole;

        this.liczbaWarstw = liczbaWarstw;
        warstwy = new Warstwa[liczbaWarstw];
        for (int i = 0; i < liczbaWarstw; i++)
        {
            warstwy[i] = new Warstwa(pole, i + 1);
        }

        pierwszaWolna = 1;
    }
    //***************************************************************************

    public Kontener getObiektAt(int numerWarstwy)
    {
        if (numerWarstwy >= pierwszaWolna || numerWarstwy < 1)
        {
            throw new IllegalArgumentException("Nieprawidlowy numer warstwy: powinien byc z zakresu 1-" + pierwszaWolna + "a jest: " + numerWarstwy);
        }

        return warstwy[numerWarstwy - 1].getKontener();
    }
    //***************************************************************************
//    public Kontener sciagnijObiekt(int warstwa)
//    {
//        if(warstwa > this.liczbaWarstw || warstwa < 1)
//        {
//            throw new IllegalArgumentException("Nieprawidłowa warstwa");
//        }
//
//        Kontener zwracany = warstwy[warstwa-1].sciagnij();
//        //TODO - przestawianie kontenerów itd !!!
//        //!
//        //!!
//        //!!!
//        //!!!!
//        return zwracany;
//    }
    //***************************************************************************

    public Kontener sciagnijObiekt()
    {
        if (pierwszaWolna == 1)
        {
            return null;
        }

        Kontener zwracany = warstwy[pierwszaWolna - 2].sciagnij();
        if (zwracany != null)
        {
            pierwszaWolna--;
        }

        return zwracany;
    }

    public double sciagnijObiekt(Kontener obiekt)
    {
        int M = pierwszaWolna;
        int w;

        double wynik = 0;
        Kontener sciagany;
        for (int i = 0; i < warstwy.length; i++)
        {
            if (warstwy[i].getKontener() == obiekt)
            {
                w = i + 1;
                sciagany = warstwy[i].sciagnij();
                for (int k = i + 1; k < pierwszaWolna - 1; k++)
                {
                    Kontener tmp = warstwy[k].sciagnij();
                    warstwy[k - 1].poloz(tmp);
                }

                pierwszaWolna--;

                if (w == pierwszaWolna)
                {
                    return 1;
                }

                wynik = 2 * (M - w - 1);
                int sgn = 1;
                if (wynik == 0)
                {
                    sgn = 0;
                }
                wynik += sgn;
                
                return wynik;
            }
        }



        throw new IllegalAccessError("Na tym polu nie ma takiego kontenera!");
    }
    //***************************************************************************

    public boolean polozObiekt(Kontener obiekt)
    {
        if (pierwszaWolna > liczbaWarstw)
        {
            return false;
        }

        boolean rezultat = false;
        rezultat = warstwy[pierwszaWolna - 1].poloz(obiekt);
        if (rezultat)
        {
            pierwszaWolna++;
        }
        return rezultat;
    }
    //***************************************************************************

    public void polozObiekt(Kontener nowy, int W)
    {
        if (W > liczbaWarstw)
        {
            throw new IllegalArgumentException("Warstwa: " + W + " jest niedopuszczalna dla danego pola");
        }

        if (pierwszaWolna == W)
        {
            polozObiekt(nowy);
        } else
        {
            throw new UnsupportedOperationException("Przekladanie kontener nie zaimplementowane w klasie Zawartosc Pola");
        }

    }
    //***************************************************************************

    public boolean isPuste()
    {
        if (pierwszaWolna == 1)
        {
            return true;
        }
        return false;

    }
    //**************************************************************************

    public boolean isPelne()
    {
        if (pierwszaWolna > liczbaWarstw)
        {
            return true;
        }
        return false;
    }
    //**************************************************************************

    public int getPierwszaWolna()
    {
        return this.pierwszaWolna;
    }

    //***************************************************************************
    public Warstwa getPierwszaWolnaWarstwa()
    {
        if (isPelne())
        {
            return null;
        }

        return this.getWarstwa(pierwszaWolna);
    }

    public boolean rezerwujPierwszaWolna()
    {
        if (isPelne())
        {
            return false;
        }
        pierwszaWolna++;
        return true;
    }

    //***************************************************************************
    public int getIloscKontenerow()
    {
        int ile = 0;
        for (int i = 0; i < warstwy.length; i++)
        {
            if (!warstwy[i].empty)
            {
                ile++;
            }
        }

        return ile;
        //return this.pierwszaWolna - 1;
    }
    //***************************************************************************

    public int getLiczbaWarstwa()
    {
        return this.liczbaWarstw;
    }
    //***************************************************************************

    public Warstwa getWarstwa(int numer)
    {
        return warstwy[numer - 1];
    }
    //***************************************************************************

    void zeruj()
    {
        while (sciagnijObiekt() != null)
        {
            //sciagamy obiekt
        }
    }
    //***************************************************************************
}
